package com.gjm.demo.mapper;

import com.gjm.demo.model.UserInfo;
import lombok.Data;
import org.apache.catalina.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper//将该类交给spring管理
public interface UserInfoMapper {

    @Select("select * from user_info;")
    List<UserInfo> selectAllInfo();

    @Select("select * from user_info where age = 12;")
    List<UserInfo> selectInfoWithId();

    //若SQL语句中只有一个参数，那么这个参数名可以随便取，不一定要与方法的参数相同
//    @Select("select * from user_info where age = #{aa};")
    @Select("select * from user_info where id = #{id};")
    List<UserInfo> selectInfoWithId2(Integer id);

    @Select("select * from user_info where id = #{id};")
    UserInfo selectInfoWithId3(Integer id);

    //使用param时，需要注意参数顺序, param1表示方法中的第一个参数，param2表示方法中的第二个参数
    @Select("select * from user_info where username = #{param1} and password = #{param2};")
            //使用与方法一样名字参数时，SQL语句中的参数顺序与方法中的参数顺序不一定要一样
//    @Select("select * from user_info where username = #{param1} and password = #{param2};")
    List<UserInfo> selectInfo(String username, String password);


    @Select("select * from user_info where username = #{param1} and password = #{password};")
    List<UserInfo> selectInfo2(String username, String password);

    @Select("select * from user_info where password = #{param2} and username = #{param1};")
    List<UserInfo> selectInfo3(String username, String password);

    //将方法中的参数改名后，只能使用改过之后的名字，使用之前的名字会报错
    @Select("select * from user_info where username = #{userName} and password = #{password};")
    List<UserInfo> selectInfo4(@Param("userName") String username, String password);

    @Insert("insert into user_info (username, password, age) values (#{username}, #{password}, #{age});")
    Integer insertInfo(String username, String password, Integer age);

    @Insert("insert into user_info (username, password, age) values (#{username}, #{password}, #{age});")
    Integer insertInfo2(UserInfo userInfo);

    @Options(useGeneratedKeys = true, keyProperty = "id")//接收新增数据的id
    @Insert("insert into user_info (username, password, age) values (#{username}, #{password}, #{age});")
    Integer insertInfo3(UserInfo userInfo);


    //改名之后，必须使用改变之后的名字
    @Insert("insert into user_info (username, password, age) values (#{userInfo.username}, #{userInfo.password}, #{userInfo.age});")
    Integer insertInfo4(@Param("userInfo") UserInfo userInfo);

    //在SQL语句中使用as来解决SQL字段与Java属性的命名标准不一样导致的获取的数据为null的情况
    @Select("select id, username, 'password', age, gender, phone, delete_flag as deleteFlag, " +
            "create_time as createTime, update_time as updateTime  from user_info; ")
    List<UserInfo> selectInfo5();

    @Results(id = "Basemap" ,value = {
            @Result(column = "default_flag", property = "defaultFlag"),
            @Result(column = "create_time", property = "createTime"),
            @Result(column = "update_time", property = "updateTime")
    })
    @Select("select * from user_info")
    List<UserInfo> selectInfo6();

    //使用配置信息
    @Select("select * from user_info")
    List<UserInfo> selectInfo7();

    //当给Result设置id后，就不需要重复写selectInfo6的Resaults的代码，直接使用就行了
    @ResultMap("Basemap")
    @Select("select * from user_info")
    List<UserInfo> selectInfo8();


    @Update("update user_info set password = #{password}, age = #{age} where id = #{id}")
    Integer updateInfo(UserInfo userInfo);

    @Delete("delete from user_info where id = #{userInfo.id}")
    Integer deleteInfo(@Param("userInfo") UserInfo userInfo);

    //数字类型加不加引号都一样
    @Select("select * from user_info where id = ${id}")
    UserInfo selectInfo9(Integer id);

    //$会直接拼接，不会自动加上''，
    @Select("select * from user_info where username = '${username}'")
    List<UserInfo> selectInfo10(String username);

    //在进行排序时，desc、asc是不能加''的，但#会自动加上''，就可以使用$
//    @Select("select * from user_info order by id #{method}")
    @Select("select * from user_info order by id ${method}")
    List<UserInfo> sort(String method);

    @Select("select * from user_info where username like concat('%',#{str},'%')")
    List<UserInfo> selectInfo11(String str);

}
